package com.kun.video.thread;

/**
 * 优先级任务包装类
 * <p>
 * 为普通Runnable任务添加优先级属性，数值越大优先级越高（推荐范围0-100）
 * 实现Comparable接口以支持优先级队列排序
 * </p>
 *
 * @author gzc
 * @since 2025/2/3
 **/
public class PrioritizedTask implements Runnable, Comparable<PrioritizedTask> {
    /**
     * 原始任务对象（不可为null）
     */
    private final Runnable task;

    /**
     * 任务优先级（数值越大执行优先级越高）
     */
    private final int priority;

    //------------------------- 构造函数 -------------------------

    /**
     * 默认优先级构造函数（优先级=5）
     *
     * @param task 待执行任务（不可为null）
     */
    public PrioritizedTask(Runnable task) {
        this(task, Thread.NORM_PRIORITY);
    }

    /**
     * 全参数构造函数
     *
     * @param task     待执行任务（不可为null）
     * @param priority 任务优先级（推荐0-100）
     * @throws IllegalArgumentException 如果task为null
     */
    public PrioritizedTask(Runnable task, int priority) {
        if (task == null) {
            throw new IllegalArgumentException("任务对象不能为null");
        }
        this.task = task;
        this.priority = priority;
    }

    //------------------------- 核心方法 -------------------------

    /**
     * 执行原始任务逻辑
     */
    @Override
    public void run() {
        task.run();
    }

    /**
     * 获取任务优先级
     */
    public int getPriority() {
        return priority;
    }

    //------------------------- 比较逻辑 -------------------------

    /**
     * 比较方法实现（倒序排列）
     *
     * @param other 对比任务对象
     * @return 比较结果（当前对象优先级高返回负数）
     */
    @Override
    public int compareTo(PrioritizedTask other) {
        // 注意：倒序比较实现高优先级在前
        return Integer.compare(other.priority, this.priority);
    }
}